﻿using System;
using System.Collections;
using System.Collections.Generic;
using System.ComponentModel;
using System.Configuration;
using System.Linq;
using System.Text;

namespace ZOVNP.Model.Abstracts
{
    /// <summary> Сервис работы с настройками </summary>
    /// <remarks> Добавляет и удаляет настройки, используемые в приложении </remarks>
    [Description("Сервис работы с настройками")]
    public class SettingsService : ISettingsServiceProvider
    {
        /// <summary> Словарь доступных настроек </summary>
        private readonly Dictionary<System.Type, ApplicationSettingsBase> m_settings = new Dictionary<System.Type, ApplicationSettingsBase>(5);

        /// <summary> Получить настройку указанного типа </summary>
        /// <param name="settingsType"> тип настройки </param>
        /// <returns> настройка или null </returns>
        public ApplicationSettingsBase GetSettings(System.Type settingsType)
        {
            lock (m_settings)
            {
                ApplicationSettingsBase result = null;
                m_settings.TryGetValue(settingsType, out result);
                return (result);
            }
        }
        /// <summary> Добавить настройку </summary>
        /// <param name="settings"> настройка </param>
        /// <param name="settingsType"> тип настройки </param>
        /// <remarks> В случае существования указанного типа настройки происходит её замена </remarks>
        public void AddSettings(ApplicationSettingsBase settings, System.Type settingsType)
        {
            lock (m_settings)
            {
                if (m_settings.ContainsKey(settingsType))
                    m_settings.Remove(settingsType);

                m_settings.Add(settingsType, settings);
            }
        }
        /// <summary> Добавить настройку </summary>
        /// <param name="settings"> настройка </param>
        public void AddSettings(ApplicationSettingsBase settings) { this.AddSettings(settings, settings.GetType()); }
        /// <summary> Удалить настройку указанного типа </summary>
        /// <param name="settingsType"> тип настройки </param>
        public void RemoveSettings(System.Type settingsType)
        {
            lock (m_settings)
                m_settings.Remove(settingsType);
        }

        #region IEnumerable<ApplicationSettingsBase>

        /// <summary> Получить итератор </summary>
        /// <returns> итератор </returns>
        /// <remarks> Итератор по настройкам </remarks>
        IEnumerator<ApplicationSettingsBase> IEnumerable<ApplicationSettingsBase>.GetEnumerator() { return (m_settings.Values.GetEnumerator()); }
        /// <summary> Получить итератор </summary>
        /// <returns> итератор </returns>
        /// <remarks> Итератор по настройкам </remarks>
        IEnumerator IEnumerable.GetEnumerator() { return (m_settings.Values.GetEnumerator()); }

        #endregion
    }
}
